#include "TaskItemWidget.h"
#include "log.h"
#include <QMouseEvent>
#include <QPainter>
#include <QStyleOption>
#include <QDrag>
#include <QMimeData>
#include <QApplication>
#include <QIcon>
#include <QMenu>
#include <QContextMenuEvent>

TaskItemWidget::TaskItemWidget(const PlanTask& task, QWidget *parent)
    : QWidget(parent)
    , m_task(task)
    , m_checkBox(new QCheckBox(this))
    , m_timeLabel(new QLabel(this))
    , m_titleLabel(new QLabel(this))
    , m_timerBtn(new QPushButton(this))
    , m_editBtn(new QPushButton(this))
    , m_deleteBtn(new QPushButton(this))
    , m_dragging(false)
    , m_highlighted(false)
{
    setupUi();
    updateDisplay();
}

TaskItemWidget::~TaskItemWidget()
{
}

void TaskItemWidget::setupUi()
{
    // [FDD-2025-03-015][UX] 改为最小高度，支持多行任务标题
    setMinimumHeight(36);  // 减小最小高度，让任务更紧凑
    setMaximumHeight(90);  // 最多支持两行标题
    setMinimumWidth(400);
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);

    // 主布局
    QHBoxLayout* mainLayout = new QHBoxLayout(this);
    mainLayout->setContentsMargins(10, 1, 10, 1);
    mainLayout->setSpacing(10);  // 组件之间的间距
    mainLayout->setAlignment(Qt::AlignVCenter);  // 垂直居中对齐

    // 复选框
    m_checkBox->setFixedSize(24, 24);
    connect(m_checkBox, &QCheckBox::toggled, this, [this](bool checked) {
        emit statusToggled(m_task.getId(), checked);
    });

    // 时间标签
    m_timeLabel->setFixedWidth(120);
    m_timeLabel->setAlignment(Qt::AlignVCenter | Qt::AlignLeft);
    QFont timeFont = m_timeLabel->font();
    timeFont.setPointSize(timeFont.pointSize() - 1);
    m_timeLabel->setFont(timeFont);

    // 标题标签 - 支持自动换行，但不过度扩展
    m_titleLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
    m_titleLabel->setWordWrap(false);  // 非紧凑模式下禁用换行，保持单行
    m_titleLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    QFont titleFont = m_titleLabel->font();
    titleFont.setBold(true);
    m_titleLabel->setFont(titleFont);

    // 计时器按钮
    m_timerBtn->setIcon(QIcon(":/resource/svg/timer.svg"));
    m_timerBtn->setIconSize(QSize(20, 20));
    m_timerBtn->setFixedSize(32, 32);
    m_timerBtn->setToolTip("为此任务启动计时器");
    m_timerBtn->setStyleSheet(
        "QPushButton { background-color: #4CAF50; color: white; border: none; border-radius: 16px; }"
        "QPushButton:hover { background-color: #45a049; }"
    );
    connect(m_timerBtn, &QPushButton::clicked, this, [this]() {
        emit timerRequested(m_task);
    });

    // 编辑按钮
    m_editBtn->setIcon(QIcon(":/resource/svg/edit.svg"));
    m_editBtn->setIconSize(QSize(20, 20));
    m_editBtn->setFixedSize(32, 32);
    m_editBtn->setToolTip("编辑任务");
    m_editBtn->setStyleSheet(
        "QPushButton { background-color: #2196F3; color: white; border: none; border-radius: 16px; }"
        "QPushButton:hover { background-color: #0b7dda; }"
    );
    connect(m_editBtn, &QPushButton::clicked, this, [this]() {
        emit editRequested(m_task);
    });

    // 删除按钮
    m_deleteBtn->setIcon(QIcon(":/resource/svg/delete.svg"));
    m_deleteBtn->setIconSize(QSize(20, 20));
    m_deleteBtn->setFixedSize(32, 32);
    m_deleteBtn->setToolTip("删除任务");
    m_deleteBtn->setStyleSheet(
        "QPushButton { background-color: #f44336; color: white; border: none; border-radius: 16px; }"
        "QPushButton:hover { background-color: #da190b; }"
    );
    connect(m_deleteBtn, &QPushButton::clicked, this, [this]() {
        emit deleteRequested(m_task.getId());
    });

    // 添加组件到布局
    mainLayout->addWidget(m_checkBox);
    mainLayout->addWidget(m_timeLabel);
    mainLayout->addWidget(m_titleLabel);
    mainLayout->addStretch();  // 添加弹性空间，让按钮靠右
    mainLayout->addWidget(m_timerBtn);
    mainLayout->addWidget(m_editBtn);
    mainLayout->addWidget(m_deleteBtn);
    
    // 设置对象名，让主题可以识别和自定义样式
    setObjectName("taskItem");
    
    // 保持基本样式（布局和间距），颜色由主题控制
    setAutoFillBackground(true);
}

void TaskItemWidget::updateTask(const PlanTask& task)
{
    m_task = task;
    updateDisplay();
}

void TaskItemWidget::updateDisplay()
{
    // 更新复选框状态
    m_checkBox->setChecked(m_task.getStatus() == TaskStatus::Completed);

    // 更新时间显示
    m_timeLabel->setText(formatTimeRange());

    // 更新标题 - 使用 QFont 的删除线而不是 HTML
    QString title = m_task.getTitle();
    QFont titleFont = m_titleLabel->font();
    titleFont.setBold(true);

    // 根据任务状态设置字体样式
    if (m_task.getStatus() == TaskStatus::Completed) {
        // 已完成：设置删除线和灰色文字
        titleFont.setStrikeOut(true);
        m_titleLabel->setStyleSheet("color: #888888;");  // 灰色文字
        m_titleLabel->setProperty("taskState", "completed");
    } else {
        // 未完成（包括逾期）：白色文字，无删除线
        titleFont.setStrikeOut(false);
        m_titleLabel->setStyleSheet("color: #e0e0e0;");  // 白色文字
        m_titleLabel->setProperty("taskState", "normal");
    }

    m_titleLabel->setFont(titleFont);
    m_titleLabel->setText(title);

    // 刷新样式（让property生效）
    m_titleLabel->style()->unpolish(m_titleLabel);
    m_titleLabel->style()->polish(m_titleLabel);

    // 如果有提醒，在标题前添加铃铛图标
    if (m_task.hasReminder()) {
        m_titleLabel->setText("🔔 " + title);
    }

    // [FDD-2025-03-015][UX] 确保标题改变后widget高度能正确更新
    updateGeometry();
}

QString TaskItemWidget::formatTimeRange() const
{
    if (!m_task.getStartTime().isValid() || !m_task.getEndTime().isValid()) {
        return "未设置时间";
    }
    
    QString startStr = m_task.getStartTime().toString("HH:mm");
    QString endStr = m_task.getEndTime().toString("HH:mm");
    
    return startStr + " - " + endStr;
}

void TaskItemWidget::setHighlighted(bool highlighted)
{
    m_highlighted = highlighted;
    update();
}

void TaskItemWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        m_dragStartPosition = event->pos();
        m_dragging = false;
    }
    QWidget::mousePressEvent(event);
}

void TaskItemWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (!(event->buttons() & Qt::LeftButton)) {
        return;
    }
    
    if ((event->pos() - m_dragStartPosition).manhattanLength() < QApplication::startDragDistance()) {
        return;
    }
    
    // 开始拖拽
    m_dragging = true;
    
    QDrag *drag = new QDrag(this);
    QMimeData *mimeData = new QMimeData;
    
    // 设置拖拽数据（任务ID）
    mimeData->setText(m_task.getId());
    drag->setMimeData(mimeData);
    
    // 创建拖拽时的预览图
    QPixmap pixmap = grab();
    drag->setPixmap(pixmap);
    drag->setHotSpot(event->pos());
    
    // 执行拖拽
    drag->exec(Qt::MoveAction);
    
    m_dragging = false;
    QWidget::mouseMoveEvent(event);
}

void TaskItemWidget::mouseReleaseEvent(QMouseEvent *event)
{
    m_dragging = false;
    QWidget::mouseReleaseEvent(event);
}

void TaskItemWidget::paintEvent(QPaintEvent *event)
{
    // 绘制基本样式
    QStyleOption opt;
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
    opt.initFrom(this);
#else
    opt.init(this);
#endif
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
    
    // 如果高亮显示，绘制边框
    if (m_highlighted) {
        p.setPen(QPen(QColor("#2196F3"), 2));
        p.drawRoundedRect(rect().adjusted(1, 1, -1, -1), 5, 5);
    }
    
    QWidget::paintEvent(event);
}

// ========== [FDD-2025-03-015] Compact Mode Support ==========

/**
 * @brief 设置紧凑模式（隐藏按钮，改用右键菜单）
 */
void TaskItemWidget::setCompactMode(bool compact)
{
    m_compactMode = compact;

    // 紧凑模式下隐藏所有操作按钮
    if (m_timerBtn) m_timerBtn->setVisible(!compact);
    if (m_editBtn) m_editBtn->setVisible(!compact);
    if (m_deleteBtn) m_deleteBtn->setVisible(!compact);

    // [FDD-2025-03-015][UX] 紧凑模式下调整高度范围
    if (compact) {
        setMinimumHeight(32);  // 紧凑模式最小高度
        setMaximumHeight(32);  // 紧凑模式固定高度，防止被拉伸
        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);  // 固定高度
    } else {
        setMinimumHeight(36);  // 与setupUi保持一致
        setMaximumHeight(90);  // 最多支持两行标题
        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);  // 根据内容调整
    }
}

/**
 * @brief 右键菜单事件处理
 */
void TaskItemWidget::contextMenuEvent(QContextMenuEvent *event)
{
    // 只在紧凑模式下显示右键菜单
    if (!m_compactMode) {
        QWidget::contextMenuEvent(event);
        return;
    }
    
    QMenu menu(this);
    
    // 添加菜单项
    QAction* timerAction = menu.addAction(QIcon(":/resource/svg/timer.svg"), tr("开始计时"));
    QAction* editAction = menu.addAction(QIcon(":/resource/svg/edit.svg"), tr("编辑任务"));
    menu.addSeparator();
    QAction* deleteAction = menu.addAction(QIcon(":/resource/svg/delete.svg"), tr("删除任务"));
    deleteAction->setObjectName("deleteAction");  // Qt 6: 使用对象名称来标识
    
    // Qt 6: 在 QMenu 上设置样式表，通过 objectName 定位删除项
    menu.setStyleSheet(
        "QMenu { "
        "  background-color: #2b2b2b; "
        "  color: #e0e0e0; "
        "  border: 1px solid #3c3c3c; "
        "}"
        "QMenu::item:selected { "
        "  background-color: #3c3c3c; "
        "}"
        "QMenu::item[objectName=\"deleteAction\"] { "
        "  color: #f44336; "  /* 红色警告 */
        "}"
    );
    
    // 执行菜单并处理选择
    QAction* selectedAction = menu.exec(event->globalPos());
    
    if (selectedAction == timerAction) {
        emit timerRequested(m_task);
    } else if (selectedAction == editAction) {
        emit editRequested(m_task);
    } else if (selectedAction == deleteAction) {
        emit deleteRequested(m_task.getId());
    }
    
    event->accept();
}

